package com.gitee.feizns.webtemplate.commons.utils.date;

import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 日期相关...
 * @author feizns
 * @since 2019/4/3
 */
public abstract class DateUtils {

    /**
     * 默认的时间格式
     */
    public static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";

    public static Date curtSqlDate() {
        return new Date(System.currentTimeMillis());
    }

    /**
     * 解析日期..
     * @param date
     * @param pattern
     * @return
     */
    public static Date parse(String date, String pattern) {
        try {
            return new Date(new SimpleDateFormat(pattern).parse(date).getTime());
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 解析日期
     * @param date
     * @return
     */
    public static Date parse(String date) {
        try {
            return new Date(new SimpleDateFormat(DEFAULT_PATTERN).parse(date).getTime());
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 为指定的日期添加天数
     * @param original
     * @param day
     * @return
     */
    public static java.util.Date plusDay(java.util.Date original, Integer day) {
        if ( day == null )
            return original;
        long dayMilliSeconds = TimeUnit.MILLISECONDS.convert(day, TimeUnit.DAYS);;
        return new Date(original.getTime() + dayMilliSeconds);
    }

    /**
     * 格式化日期
     * @param date
     * @param pattern
     * @return
     */
    public static String format(java.util.Date date, String pattern) {
        return new SimpleDateFormat(pattern).format(date);
    }

    /**
     * 格式化日期
     * @param date
     * @return
     */
    public static String format(java.util.Date date) {
        if ( date != null )
            return new SimpleDateFormat(DEFAULT_PATTERN).format(date);
        return null;
    }

    /**
     * 获取当月的天数
     */
    public static int getCurrentMonthDay() {
        Calendar a = Calendar.getInstance();
        a.set(Calendar.DATE, 1);
        a.roll(Calendar.DATE, -1);
        return a.get(Calendar.DATE);
    }

    /**
     * 根据年 月 获取对应的月份 天数
     */
    public static int getDaysByYearMonth(int year, int month) {
        Calendar a = Calendar.getInstance();
        a.set(Calendar.YEAR, year);
        a.set(Calendar.MONTH, month - 1);
        a.set(Calendar.DATE, 1);
        a.roll(Calendar.DATE, -1);
        return a.get(Calendar.DATE);
    }

    /**
     * 获取两个日期之间的所有天
     * @param startTime
     * @param endTime
     * @return
     */
    public static List<java.util.Date> getDays(java.util.Date startTime, java.util.Date endTime) {

        if ( endTime == null )
            endTime = new java.util.Date();

        // 转化成日期类型
        List<java.util.Date> result = new LinkedList<>();

        //用Calendar 进行日期比较判断
        Calendar calendar = Calendar.getInstance();

        while (startTime.getTime() <= endTime.getTime()){
            // 把日期添加到集合
            result.add(startTime);
            // 设置日期
            calendar.setTime(startTime);
            //把日期增加一天
            calendar.add(Calendar.DATE, 1);
            // 获取增加后的日期
            startTime = calendar.getTime();
        }

        return result;
    }

    public static java.util.Date getDate(int year, int month, int day) {
        return parse(year + "-" + month + "-" + day, "yyyy-MM-dd");
    }

    /**
     * 获取某月的最后一天
     */
    public static java.util.Date getLastDayOfMonth(int year, int month) {

        Calendar cal = Calendar.getInstance();
        //设置年份
        cal.set(Calendar.YEAR, year);
        //设置月份
        cal.set(Calendar.MONTH, month - 1);
        //获取某月最大天数
        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        //设置日历中月份的最大天数
        cal.set(Calendar.DAY_OF_MONTH, lastDay);
        //格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        return cal.getTime();
    }

    /**
     * 获取某月的最后一天
     */
    public static java.util.Date getFirstDayOfMonth(int year, int month) {
        return parse(year + "-" + month + "-" + "01", "yyyy-MM-dd");
    }

}
